squid 透明代理配置

什么是透明代理?

        透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改变你的request fields(报文),并会传送真实IP,多用于路由器的NAT转发中。

透明代理的原理:

  1. 假设A为内部网络客户机
  2. B为外部网络服务器,B提供的服务为httpd服务,监听端口为80
  3. C为代理服务器(也是我们的网关),假如代理服务器提供服务端口为3128

        过程: 当A向B的80端口请求数据时,TCP连接请求要先经过C,C看到A请求的是B的80端口时,C由于已经设置了转发规则,所以C会把A的请求80端口转发到自己的3128端口,也就是说A将要直接访问C的3128端口,而非B服务器的80端口,此时,C会先去访问B的80端口,把A要访问B的请求数据先请求过来,保存到C上,然后C再把请求数据吐给A。而在A看来,它貌似是直接请求的B,而实际并非如此。由于这些连接过程是自动的,不需要客户端手工配置代理服务器,甚至用户根本不知道代理服务器的存在,因而对用户来说是透明的。

来配置透明代理:

        通过上面的原理分析,可知,只有代理服务器为网关时,才可以实现透明代理的功能,否则无效。实际应用中,透明代理服务器应该有至少两个网卡,第一个网卡连接到外网,或者它可以直接上网,第二个网卡连接的是内部的一个局域网段,也就是想使用代理上网的网段。

        假设,透明代理服务器的网卡1eth0设置IP为 10.2.1.100(可以上网的ip), 网卡2eth1的ip设置为192.168.19.1,那么要通过透明代理上网的局域网段应该为 192.168.19.0/24,并且在该局域网的客户机应该设置的网关地址为192.168.19.1.

1.安装squid

1
yum install -y squid

2.配置squid

1
2
rm -f /etc/squid/squid.conf
vim /etc/squid/squid.conf

        写入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
http_port 3128 transparent
acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl SSL_ports port 443
acl Safe_ports port 80 8080 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localnet
http_access allow localhost
http_access deny all
cache_dir aufs /data/cache 1024 16 256
cache_mem 128 MB
hierarchy_stoplist cgi-bin ?
coredump_dir /var/spool/squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern \.(jpg|png|gif|mp3|xml) 1440 50% 2880 ignore-reload
refresh_pattern . 0 20% 4320

3.创建缓存目录,并修改权限

1
mkdir /data/cahce; chown -R squid:squid /data/cache

4.初始化缓存目录

1
squid -z

5.启动squid

1
service squid start

6.打开端口转发

1
echo "1" > /proc/sys/net/ipv4/ip_forward

7. 设置防火墙规则

1
2
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -p tcp -s 192.168.19.0/24 --dport 80 -j REDIRECT --to-ports 3128